package co.edu.uniandes.ecos.itera.tsp.interfaz;

import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeSelectionModel;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.File;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
import java.util.Map.Entry;

import co.edu.uniandes.ecos.itera.tsp.mundo.*;
import co.edu.uniandes.ecos.itera.tsp.anotaciones.*;

/**
 * Esta clase es el menu principal del aplicativo. Integra a las otras ventanas.
 */
@Tiempos( { @LogT(date = "2011-03-20", min = 4, taskId = 111),
		@LogT(date = "2011-03-20", min = 25, taskId = 111),
		@LogT(date = "2011-03-20", min = 153, taskId = 111),
		@LogT(date = "2011-03-25", min = 149, taskId = 962),
		@LogT(date = "2011-03-26", min = 16, taskId = 962),
		@LogT(date = "2011-03-26", min = 15, taskId = 130) })
@LogsD( {
		@LogD(etapaInyectada = Etapa.DESARROLLO, idDefecto = 4, taskId = 962), // Error
																				// en
																				// el
																				// codigo
																				// de
																				// Oscar
																				// que
																				// no
																				// agrego
																				// el
																				// metodo
																				// de
																				// cargarEntidad
																				// en
																				// ManejadorDesarrollador
		@LogD(etapaInyectada = Etapa.DESARROLLO, idDefecto = 4, taskId = 962), // Error
																				// en
																				// el
																				// codigo
																				// de
																				// Diego
																				// que
																				// no
																				// compilaba
																				// por
																				// inyectar
																				// un
																				// error
																				// en
																				// manejadorCiclo
		@LogD(etapaInyectada = Etapa.DESARROLLO, idDefecto = 4, taskId = 962), // Error
																				// en
																				// el
																				// codigo
																				// de
																				// Diego
																				// que
																				// trata
																				// dearreglar
																				// el
																				// error
																				// en
																				// ManejadorCiclo
																				// pero
																				// da�a
																				// la
																				// estructura
																				// por
																				// defecto
																				// de
																				// la
																				// entidad
																				// Ciclo
		@LogD(etapaInyectada = Etapa.DESARROLLO, idDefecto = 7, taskId = 962) // Error
																				// en
																				// el
																				// codigo
																				// de
																				// Diego
																				// en
																				// pantalla
																				// de
																				// ManejarCiclos,
																				// no
																				// se
																				// estaba
																				// inicializando
																				// bien
																				// el
																				// arreglo
																				// de
																				// JTextFileds
})
public class MenuPrincipal extends JFrame implements TreeSelectionListener,
		MouseListener, ActionListener, WindowListener {
	/**
	 * Id para reconocer como unico a este proyecto
	 */
	private static final long serialVersionUID = 1L;

	/**
	 * Referencia al mundo de negocio
	 */
	private DelegadoNegocio delegadoNegocio;

	/**
	 * Arbol para pintar los atributos del programa
	 */
	private JTree arbol;

	/**
	 * Panel donde van los datos
	 */
	private JPanel panelDatos;

	private JScrollPane vistaArbol;
	private JScrollPane vistaDatos;
	private JSplitPane splitPane;

	private static String NODO_RAIZ = "TSP iTERA";
	private static String NODO_DEFECTOS = "Defectos";
	private static String NODO_INTERRUPCINES = "Interrupciones";
	private static String NODO_PROYECTOS = "Proyectos";
	private static String NODO_CICLOS = "Ciclos";
	private static String NODO_EQUIPO = "Equipo TSP";

	private static String CMD_AGREGAR_DEFECTO = "Agregar Defecto";
	private static String CMD_AGREGAR_PROYECTO = "Agregar Proyecto";
	private static String CMD_AGREGAR_INTERRUPCION = "Agregar Interrupcion";
	private static String CMD_AGREGAR_CICLO = "Agregar Ciclo";
	private static String CMD_AGREGAR_DESARROLLADOR = "Agregar Desarrollador";
	private static String CMD_AGREGAR_TAREA = "Agregar Tarea";
	private static String CMD_CARGAR_ARCHIVO = "Cargar Archivo";
	private static String CMD_CARGAR_DIRECTORIO = "Cargar Directorio";
	private static String CMD_PLAN_CALIDAD_PROYECTO = "Plan Calidad Proyecto";
	private static String CMD_PLAN_CALIDAD_CICLO = "Plan Calidad Ciclo";
	private static String CMD_PLAN_PRODUCTO_PROYECTO = "Plan Producto Proyecto";
	private static String CMD_PLAN_PRODUCTO_CICLO = "Plan Producto Ciclo";
	private static String CMD_REPORTE_AVANCE_PROYECTO = "Reporte Avance Proyecto";
	private static String CMD_REPORTE_CALIDAD_CICLO = "Reporte Calidad Ciclo";
	private static String CMD_REPORTE_PRODUCTO= "Reporte Producto ciclo";
	private static String CMD_REPORTE_PRODUCTO_PROYECTO = "Reporte Producto Proyecto";

	private static String CMD_REPORTE_AVANCE_CICLO = "Reporte Avance Ciclo";

	/**
	 * Identifica al nodo raiz del arbol
	 */
	private DefaultMutableTreeNode raiz;

	/**
	 * Constructor por defecto es esta clase
	 */
	public MenuPrincipal() {
		this.delegadoNegocio = new DelegadoNegocio();

		try {
			this.delegadoNegocio.cargarModelo();
		} catch (Exception ex) {
			System.out.println("Error Cargando Modelo de Disco: "
					+ ex.getMessage());
		}

		this.pintarse();
	}

	/**
	 * Metodo para pintar la interfaz grafica
	 */
	@Loc(size = 10, taskId = 111)
	private void pintarse() {
		this.setLayout(new GridLayout(1, 0));

		this.panelDatos = new JPanel();
		this.vistaDatos = new JScrollPane(this.panelDatos);

		this.splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
		splitPane.setRightComponent(vistaDatos);
		splitPane.setDividerLocation(200);
		splitPane.setPreferredSize(new Dimension(700, 500));

		add(splitPane);

		this.cargarArbol();

		// setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		addWindowListener(this);
	}

	/**
	 * Crea el arbol con los datos de los proyectos, defectos e interrupciones
	 */
	@Loc(size = 80, taskId = 111)
	public void cargarArbol() {
		this.raiz = new DefaultMutableTreeNode(NODO_RAIZ);

		this.arbol = new JTree(this.raiz);
		this.arbol.getSelectionModel().setSelectionMode(
				TreeSelectionModel.SINGLE_TREE_SELECTION);
		this.arbol.addMouseListener(this);
		this.arbol.addTreeSelectionListener(this);
		this.arbol.putClientProperty("JTree.lineStyle", "Horizontal");

		this.vistaArbol = new JScrollPane(this.arbol);
		this.vistaArbol.setMinimumSize(new Dimension(100, 50));
		splitPane.setLeftComponent(vistaArbol);

		splitPane.setPreferredSize(new Dimension(700, 500));

		DefaultMutableTreeNode nodoDefectos = new DefaultMutableTreeNode(
				NODO_DEFECTOS);
		this.raiz.add(nodoDefectos);

		DefaultMutableTreeNode nodoInterrupciones = new DefaultMutableTreeNode(
				NODO_INTERRUPCINES);
		this.raiz.add(nodoInterrupciones);

		DefaultMutableTreeNode nodoProyectos = new DefaultMutableTreeNode(
				NODO_PROYECTOS);
		this.raiz.add(nodoProyectos);

		List<Proyecto> proyectos = this.delegadoNegocio.listarProyectos();
		List<Defecto> defectos = this.delegadoNegocio.listarDefectos();
		List<Interrupcion> interrupciones = this.delegadoNegocio
				.listarInterrupciones();

		for (Defecto defecto : defectos) {
			DefaultMutableTreeNode nodo = new DefaultMutableTreeNode(defecto);
			nodoDefectos.add(nodo);
		}

		for (Interrupcion interrupcion : interrupciones) {
			DefaultMutableTreeNode nodo = new DefaultMutableTreeNode(
					interrupcion);
			nodoInterrupciones.add(nodo);
		}

		for (Proyecto proyecto : proyectos) {
			DefaultMutableTreeNode nodoProyecto = new DefaultMutableTreeNode(
					proyecto);
			nodoProyectos.add(nodoProyecto);

			DefaultMutableTreeNode nodoCiclos = new DefaultMutableTreeNode(
					NODO_CICLOS);
			nodoProyecto.add(nodoCiclos);

			DefaultMutableTreeNode nodoEquipo = new DefaultMutableTreeNode(
					NODO_EQUIPO);
			nodoProyecto.add(nodoEquipo);

			for (Ciclo ciclo : proyecto.listarCiclos()) {
				DefaultMutableTreeNode nodoCiclo = new DefaultMutableTreeNode(
						ciclo);
				nodoCiclos.add(nodoCiclo);

				Hashtable<Etapa, List<Tarea>> tareasPorEtapa = new Hashtable<Etapa, List<Tarea>>();
				for (Tarea tarea : ciclo.listarTareas()) {
					List<Tarea> tareas = null;
					if (!tareasPorEtapa.containsKey(tarea.getEtapa())) {
						tareas = new ArrayList<Tarea>();
						tareas.add(tarea);
						tareasPorEtapa.put(tarea.getEtapa(), tareas);
					} else {
						tareas = tareasPorEtapa.get(tarea.getEtapa());
						tareas.add(tarea);
					}
				}

				for (Entry<Etapa, List<Tarea>> datoEtapa : tareasPorEtapa
						.entrySet()) {
					DefaultMutableTreeNode nodoEtapa = new DefaultMutableTreeNode(
							datoEtapa.getKey());
					nodoCiclo.add(nodoEtapa);

					for (Tarea tarea : datoEtapa.getValue()) {
						DefaultMutableTreeNode nodo = new DefaultMutableTreeNode(
								tarea);
						nodoEtapa.add(nodo);
					}
				}
			}

			for (Rol rol : proyecto.listarRoles()) {
				DefaultMutableTreeNode nodoRol = new DefaultMutableTreeNode(rol);
				nodoEquipo.add(nodoRol);

				for (Desarrollador desarrollador : rol.listarDesarrolladores()) {
					DefaultMutableTreeNode nodo = new DefaultMutableTreeNode(
							desarrollador);
					nodoRol.add(nodo);
				}
			}
		}

		this.vistaArbol.updateUI();
	}

	/**
	 * Evento que ocurre cuando se hace click en el arbol
	 */
	@Override
	@Loc(size = 56, taskId = 111)
	public void mouseClicked(MouseEvent e) {
		if (e.getButton() == MouseEvent.BUTTON1 && e.getClickCount() == 2) // click
																			// izquierdo
																			// doble
																			// click
		{
			DefaultMutableTreeNode node = (DefaultMutableTreeNode) this.arbol
					.getLastSelectedPathComponent();
			if (node != null) {
				Object objetoSeleccionado = node.getUserObject();
				if (objetoSeleccionado instanceof Defecto) {
					Defecto defectoACargar = (Defecto) objetoSeleccionado;
					ManejarDefectos panel = new ManejarDefectos(
							delegadoNegocio, this);
					panel.cargarEntidad(defectoACargar);
					this.panelDatos.removeAll();

					this.panelDatos.setLayout(new BorderLayout());
					this.panelDatos.add(panel, BorderLayout.CENTER);
					this.panelDatos.updateUI();
				} else if (objetoSeleccionado instanceof Interrupcion) {
					Interrupcion interrupcionACargar = (Interrupcion) objetoSeleccionado;
					ManejarInterrupciones panel = new ManejarInterrupciones(
							delegadoNegocio, this);
					panel.cargarEntidad(interrupcionACargar);
					this.panelDatos.removeAll();

					this.panelDatos.setLayout(new BorderLayout());
					this.panelDatos.add(panel, BorderLayout.CENTER);
					this.panelDatos.updateUI();
				} else if (objetoSeleccionado instanceof Proyecto) {
					Proyecto proyectoACargar = (Proyecto) objetoSeleccionado;
					ManejarProyecto panel = new ManejarProyecto(
							delegadoNegocio, this);
					panel.cargarEntidad(proyectoACargar);
					this.panelDatos.removeAll();

					this.panelDatos.setLayout(new BorderLayout());
					this.panelDatos.add(panel, BorderLayout.CENTER);
					this.panelDatos.updateUI();
				} else if (objetoSeleccionado instanceof Ciclo) {
					Ciclo cicloACargar = (Ciclo) objetoSeleccionado;
					ManejarCiclo panel = new ManejarCiclo(delegadoNegocio, this, null);
					panel.cargarEntidades(cicloACargar);
					this.panelDatos.removeAll();

					this.panelDatos.setLayout(new BorderLayout());
					this.panelDatos.add(panel, BorderLayout.CENTER);
					this.panelDatos.updateUI();
				} else if (objetoSeleccionado instanceof Tarea) {
					Ciclo ciclo = new Ciclo();
					Proyecto proyecto = new Proyecto();
					Tarea tareaACargar = (Tarea) objetoSeleccionado;
					ManejarTareas panel = new ManejarTareas(delegadoNegocio,
							this, ciclo, proyecto);
					panel.cargarEntidad(tareaACargar);
					this.panelDatos.removeAll();

					this.panelDatos.setLayout(new BorderLayout());
					this.panelDatos.add(panel, BorderLayout.CENTER);
					this.panelDatos.updateUI();
				} else if (objetoSeleccionado instanceof Desarrollador) {
					/*
					 * Desarrollador desarrolladorACargar =
					 * (Desarrollador)objetoSeleccionado; ManejarEquipo panel =
					 * new ManejarEquipo(delegadoNegocio, this);
					 * panel.cargarEntidad(desarrolladorACargar);
					 * this.panelDatos.removeAll();
					 * 
					 * this.panelDatos.setLayout(new BorderLayout());
					 * this.panelDatos.add(panel, BorderLayout.CENTER);
					 * this.panelDatos.updateUI();
					 */
				}
			}
		}
	}

	@Override
	public void mousePressed(MouseEvent e) {
	}

	@Override
	public void mouseReleased(MouseEvent e) {
	}

	@Override
	public void mouseEntered(MouseEvent e) {
	}

	@Override
	public void mouseExited(MouseEvent e) {
	}

	/**
	 * Evento llamado cuando se cambia la seleccion de un nodo del arbol
	 */
	@Override
	@Loc(size = 107, taskId = 111)
	public void valueChanged(TreeSelectionEvent e) {
		this.arbol.setComponentPopupMenu(null);

		DefaultMutableTreeNode nodo = (DefaultMutableTreeNode) this.arbol
				.getLastSelectedPathComponent();

		if (nodo == null)
			return;

		Object objetoNodo = nodo.getUserObject();
		if (objetoNodo instanceof String) {
			if (objetoNodo.toString().compareTo(NODO_DEFECTOS) == 0) {
				JPopupMenu popUp = new JPopupMenu();
				JMenuItem menuItem = new JMenuItem("Agregar un Defecto");
				menuItem.addActionListener(this);
				menuItem.setActionCommand(CMD_AGREGAR_DEFECTO);
				popUp.add(menuItem);

				this.arbol.setComponentPopupMenu(popUp);
			} else if (objetoNodo.toString().compareTo(NODO_INTERRUPCINES) == 0) {
				JPopupMenu popUp = new JPopupMenu();
				JMenuItem menuItem = new JMenuItem("Agregar una Interrupcion");
				menuItem.addActionListener(this);
				menuItem.setActionCommand(CMD_AGREGAR_INTERRUPCION);
				popUp.add(menuItem);

				this.arbol.setComponentPopupMenu(popUp);
			} else if (objetoNodo.toString().compareTo(NODO_PROYECTOS) == 0) {
				JPopupMenu popUp = new JPopupMenu();
				JMenuItem menuItem = new JMenuItem("Agregar un Proyecto");
				menuItem.addActionListener(this);
				menuItem.setActionCommand(CMD_AGREGAR_PROYECTO);
				popUp.add(menuItem);

				this.arbol.setComponentPopupMenu(popUp);
			} else if (objetoNodo.toString().compareTo(NODO_CICLOS) == 0) {
				JPopupMenu popUp = new JPopupMenu();
				JMenuItem menuItem = new JMenuItem("Agregar un Ciclo");
				menuItem.addActionListener(this);
				menuItem.setActionCommand(CMD_AGREGAR_CICLO);
				popUp.add(menuItem);

				this.arbol.setComponentPopupMenu(popUp);
			} else if (objetoNodo.toString().compareTo(NODO_EQUIPO) == 0) {
				JPopupMenu popUp = new JPopupMenu();
				JMenuItem menuItem = new JMenuItem("Agregar un Desarrollador");
				menuItem.addActionListener(this);
				menuItem.setActionCommand(CMD_AGREGAR_DESARROLLADOR);
				popUp.add(menuItem);

				this.arbol.setComponentPopupMenu(popUp);
			}
		} else // de lo contrario, se analiza cual tipo de nodo es
		{
			if (objetoNodo instanceof Proyecto) {
				JPopupMenu popUp = new JPopupMenu();
				JMenuItem menuItem = new JMenuItem("Generar Plan de Calidad");
				menuItem.addActionListener(this);
				menuItem.setActionCommand(CMD_PLAN_CALIDAD_PROYECTO);
				popUp.add(menuItem);

				menuItem = new JMenuItem("Generar Plan de Producto");
				menuItem.addActionListener(this);
				menuItem.setActionCommand(CMD_PLAN_PRODUCTO_PROYECTO);
				popUp.add(menuItem);

				menuItem = new JMenuItem("Generar Reporte Avance");
				menuItem.addActionListener(this);
				menuItem.setActionCommand(CMD_REPORTE_AVANCE_PROYECTO);
				popUp.add(menuItem);

				menuItem = new JMenuItem("Cargar Archivo Java");
				menuItem.addActionListener(this);
				menuItem.setActionCommand(CMD_CARGAR_ARCHIVO);
				popUp.add(menuItem);

				menuItem = new JMenuItem("Cargar Directorio Java");
				menuItem.addActionListener(this);
				menuItem.setActionCommand(CMD_CARGAR_DIRECTORIO);
				popUp.add(menuItem);
				
				menuItem = new JMenuItem("Reporte de producto por proyecto");
				menuItem.addActionListener(this);
				menuItem.setActionCommand(CMD_REPORTE_PRODUCTO_PROYECTO);
				popUp.add(menuItem);

				this.arbol.setComponentPopupMenu(popUp);
			} else if (objetoNodo instanceof Ciclo) {
				JPopupMenu popUp = new JPopupMenu();
				JMenuItem menuItem = new JMenuItem("Generar Plan de Calidad");
				menuItem.addActionListener(this);
				menuItem.setActionCommand(CMD_PLAN_CALIDAD_CICLO);
				popUp.add(menuItem);

				menuItem = new JMenuItem("Generar Plan de Producto");
				menuItem.addActionListener(this);
				menuItem.setActionCommand(CMD_PLAN_PRODUCTO_CICLO);
				popUp.add(menuItem);

				menuItem = new JMenuItem("Generar Reporte Avance");
				menuItem.addActionListener(this);
				menuItem.setActionCommand(CMD_REPORTE_AVANCE_CICLO);
				popUp.add(menuItem);

				menuItem = new JMenuItem("Generar Reporte Calidad Ciclo");
				menuItem.addActionListener(this);
				menuItem.setActionCommand(CMD_REPORTE_CALIDAD_CICLO);
				popUp.add(menuItem);
				
				menuItem = new JMenuItem("Generar Reporte Producto Ciclo");
				menuItem.addActionListener(this);
				menuItem.setActionCommand(CMD_REPORTE_PRODUCTO);
				popUp.add(menuItem);

				menuItem = new JMenuItem("Agregar Tarea");
				menuItem.addActionListener(this);
				menuItem.setActionCommand(CMD_AGREGAR_TAREA);
				popUp.add(menuItem);

				this.arbol.setComponentPopupMenu(popUp);
			}
		}
	}

	/**
	 * Evento que se llama cuando ocurre una accion en la pantalla
	 */
	@Override
	@Loc(size = 99, taskId = 111)
	public void actionPerformed(ActionEvent e) {
		String comando = e.getActionCommand();

		if (comando.equals(CMD_AGREGAR_DEFECTO)) {
			ManejarDefectos panel = new ManejarDefectos(delegadoNegocio, this);
			this.panelDatos.removeAll();

			this.panelDatos.setLayout(new BorderLayout());
			this.panelDatos.add(panel, BorderLayout.CENTER);
			this.panelDatos.updateUI();
		} else if (comando.equals(CMD_AGREGAR_INTERRUPCION)) {
			ManejarInterrupciones panel = new ManejarInterrupciones(
					delegadoNegocio, this);
			this.panelDatos.removeAll();

			this.panelDatos.setLayout(new BorderLayout());
			this.panelDatos.add(panel, BorderLayout.CENTER);
			this.panelDatos.updateUI();
		} else if (comando.equals(CMD_AGREGAR_PROYECTO)) {
			ManejarProyecto panel = new ManejarProyecto(delegadoNegocio, this);
			this.panelDatos.removeAll();

			this.panelDatos.setLayout(new BorderLayout());
			this.panelDatos.add(panel, BorderLayout.CENTER);
			this.panelDatos.updateUI();
		} else if (comando.equals(CMD_AGREGAR_DESARROLLADOR)) {
			ManejarEquipo panel = new ManejarEquipo(delegadoNegocio, this);
			this.panelDatos.removeAll();

			this.panelDatos.setLayout(new BorderLayout());
			this.panelDatos.add(panel, BorderLayout.CENTER);
			this.panelDatos.updateUI();
		} else if (comando.equals(CMD_AGREGAR_CICLO)) {
			DefaultMutableTreeNode nodoProyecto = (DefaultMutableTreeNode) ((DefaultMutableTreeNode) this.arbol
					.getLastSelectedPathComponent()).getParent();
			if (nodoProyecto != null) {
				Object objetoProyecto = nodoProyecto.getUserObject();
				if (objetoProyecto instanceof Proyecto) {
					Proyecto proyecto = (Proyecto) objetoProyecto;

					ManejarCiclo panel = new ManejarCiclo(delegadoNegocio, this, proyecto);
					this.panelDatos.removeAll();

					this.panelDatos.setLayout(new BorderLayout());
					this.panelDatos.add(panel, BorderLayout.CENTER);
					this.panelDatos.updateUI();
				}
			}
		} else if (comando.equals(CMD_AGREGAR_TAREA)) {
			Ciclo ciclo = null;
			Proyecto proyecto = null;

			DefaultMutableTreeNode nodoCiclo = (DefaultMutableTreeNode) this.arbol
					.getLastSelectedPathComponent();
			DefaultMutableTreeNode nodoProyecto = (DefaultMutableTreeNode) nodoCiclo
					.getParent().getParent();
			if (nodoCiclo != null) {
				Object objeto = nodoCiclo.getUserObject();
				if (objeto instanceof Ciclo)
					ciclo = (Ciclo) objeto;
			}
			if (nodoProyecto != null) {
				Object objeto = nodoProyecto.getUserObject();
				if (objeto instanceof Proyecto)
					proyecto = (Proyecto) objeto;
			}

			if (ciclo != null && proyecto != null) {
				ManejarTareas panel = new ManejarTareas(delegadoNegocio, this,
						ciclo, proyecto);
				this.panelDatos.removeAll();

				this.panelDatos.setLayout(new BorderLayout());
				this.panelDatos.add(panel, BorderLayout.CENTER);
				this.panelDatos.updateUI();
			}
		} else if (comando.equals(CMD_CARGAR_ARCHIVO)) {
			DefaultMutableTreeNode nodoProyecto = (DefaultMutableTreeNode) this.arbol
					.getLastSelectedPathComponent();
			Object objetoSeleccionado = nodoProyecto.getUserObject();
			if (objetoSeleccionado instanceof Proyecto) {
				Proyecto proyectoSeleccionado = (Proyecto) objetoSeleccionado;
				JFileChooser cargadorArchivo = new JFileChooser();
				if (cargadorArchivo.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
					File archivoJava = cargadorArchivo.getSelectedFile();
					if (archivoJava.exists() && archivoJava.isFile()) {
						try {
							List<String> erroresEncontrados = this.delegadoNegocio
									.procesarArchivo(archivoJava
											.getAbsolutePath(),
											proyectoSeleccionado);

							if (erroresEncontrados.size() > 0) {
								ArrayList<String> procesados = new ArrayList<String>();
								String errores = "";
								int i = 0;
								for (String error : erroresEncontrados) {
									if (procesados.indexOf(error) > -1)
										continue;

									procesados.add(error);
									errores += "\n" + error;
									i++;

									if (i > 5)
										break;
								}

								JOptionPane.showMessageDialog(this,
										"Se encontraron errores en la carga. Los primeros 5 errores son: "
												+ errores,
										"Errores encontrados en carga",
										JOptionPane.WARNING_MESSAGE);
							} else
								JOptionPane
										.showMessageDialog(
												this,
												"Se ha cargado el archivo de java exitosamente",
												"exito en la Carga",
												JOptionPane.INFORMATION_MESSAGE);
						} catch (Exception ex) {
							JOptionPane.showMessageDialog(this,
									"Error cargando archivo Java: "
											+ ex.getMessage(), "Error",
									JOptionPane.ERROR_MESSAGE);
						}
					}
				}
			}
		} else if (comando.equals(CMD_CARGAR_DIRECTORIO)) {
			DefaultMutableTreeNode nodoProyecto = (DefaultMutableTreeNode) this.arbol
					.getLastSelectedPathComponent();
			Object objetoSeleccionado = nodoProyecto.getUserObject();
			if (objetoSeleccionado instanceof Proyecto) {
				Proyecto proyectoSeleccionado = (Proyecto) objetoSeleccionado;
				JFileChooser cargadorDirectorio = new JFileChooser();
				cargadorDirectorio
						.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
				if (cargadorDirectorio.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
					File directorioJava = cargadorDirectorio.getSelectedFile();
					if (directorioJava.exists() && directorioJava.isDirectory()) {
						try {
							List<String> erroresEncontrados = this.delegadoNegocio
									.procesarDirectorio(directorioJava
											.getAbsolutePath(),
											proyectoSeleccionado);

							if (erroresEncontrados.size() > 0) {
								ArrayList<String> procesados = new ArrayList<String>();
								String errores = "";
								int i = 0;
								for (String error : erroresEncontrados) {
									if (procesados.indexOf(error) > -1)
										continue;

									procesados.add(error);
									errores += "\n" + error;
									i++;

									if (i > 5)
										break;
								}

								JOptionPane.showMessageDialog(this,
										"Se encontraron errores en la carga. Los primeros 5 errores son: "
												+ errores,
										"Errores encontrados en carga",
										JOptionPane.WARNING_MESSAGE);
							} else
								JOptionPane
										.showMessageDialog(
												this,
												"Se ha cargado el directorio de java exitosamente",
												"exito en la Carga",
												JOptionPane.INFORMATION_MESSAGE);
						} catch (Exception ex) {
							JOptionPane.showMessageDialog(this,
									"Error cargando directorio Java: "
											+ ex.getMessage(), "Error",
									JOptionPane.ERROR_MESSAGE);
						}
					}
				}
			}
		} else if (comando.equals(CMD_PLAN_CALIDAD_PROYECTO)) {

		} else if (comando.equals(CMD_PLAN_CALIDAD_CICLO)) {

		} else if (comando.equals(CMD_PLAN_PRODUCTO_PROYECTO)) {

		} else if (comando.equals(CMD_PLAN_PRODUCTO_CICLO)) {

		} else if (comando.equals(CMD_REPORTE_AVANCE_PROYECTO)) {

		} else if (comando.equals(CMD_REPORTE_CALIDAD_CICLO)) {
			Ciclo ciclo = null;

			DefaultMutableTreeNode nodoCiclo = (DefaultMutableTreeNode) this.arbol
					.getLastSelectedPathComponent();
			DefaultMutableTreeNode nodoProyecto = (DefaultMutableTreeNode) nodoCiclo
					.getParent().getParent();
			if (nodoCiclo != null) {
				Object objeto = nodoCiclo.getUserObject();
				if (objeto instanceof Ciclo)
					ciclo = (Ciclo) objeto;
			}

			if (ciclo != null) {
				ReporteCalidad panel = new ReporteCalidad(delegadoNegocio,
						this, ciclo);

				this.panelDatos.removeAll();

				this.panelDatos.setLayout(new BorderLayout());
				this.panelDatos.add(panel, BorderLayout.CENTER);
				this.panelDatos.updateUI();
			}

		} else if (comando.equals(CMD_REPORTE_AVANCE_CICLO)) {

		}
		else if (comando.equals(CMD_REPORTE_PRODUCTO)) {
			Ciclo ciclo = null;

			DefaultMutableTreeNode nodoCiclo = (DefaultMutableTreeNode) this.arbol
					.getLastSelectedPathComponent();
			DefaultMutableTreeNode nodoProyecto = (DefaultMutableTreeNode) nodoCiclo
					.getParent().getParent();
			if (nodoCiclo != null) {
				Object objeto = nodoCiclo.getUserObject();
				if (objeto instanceof Ciclo)
					ciclo = (Ciclo) objeto;
			}

			if (ciclo != null) {
				ReporteProducto panel = new ReporteProducto(delegadoNegocio,
						this, ciclo);

				this.panelDatos.removeAll();

				this.panelDatos.setLayout(new BorderLayout());
				this.panelDatos.add(panel, BorderLayout.CENTER);
				this.panelDatos.updateUI();
			}

		}else if (comando.equals(CMD_REPORTE_PRODUCTO_PROYECTO)) {
			Proyecto proyecto= null;

			DefaultMutableTreeNode nodoProyecto = (DefaultMutableTreeNode) this.arbol
					.getLastSelectedPathComponent();
			if (nodoProyecto != null) {
				Object objeto = nodoProyecto.getUserObject();
				if (objeto instanceof Proyecto)
					proyecto = (Proyecto) objeto;
			}

			if (proyecto != null) {
				ReporteProducto panel = new ReporteProducto(delegadoNegocio,
						this, proyecto);

				this.panelDatos.removeAll();

				this.panelDatos.setLayout(new BorderLayout());
				this.panelDatos.add(panel, BorderLayout.CENTER);
				this.panelDatos.updateUI();
			}

		}
	}

	@Override
	public void windowOpened(WindowEvent e) {

	}

	/**
	 * Se sobreescribe este metodo para almacenar el modelo de RAM a Disco
	 */
	@Override
	@Loc(size = 12, taskId = 962)
	public void windowClosing(WindowEvent e) {
		try {
			this.delegadoNegocio.almacenarModelo();
		} catch (Exception ex) {
			JOptionPane.showMessageDialog(this,
					"Error Almacenando Modelo a Disco: " + ex.getMessage(),
					"Error", JOptionPane.ERROR_MESSAGE);
		} finally {
			System.exit(0);
		}
	}

	@Override
	public void windowClosed(WindowEvent e) {
	}

	@Override
	public void windowIconified(WindowEvent e) {
	}

	@Override
	public void windowDeiconified(WindowEvent e) {
	}

	@Override
	public void windowActivated(WindowEvent e) {
	}

	@Override
	public void windowDeactivated(WindowEvent e) {
	}

}
